package cn.yuemouren.leetcode;

/**
 * @Author: Timi
 * @Description: TODO
 * @Date: 2020/8/6 8:06
 */
public class Test_202 {
    /**
     * 暴力法判断
     * @param n
     * @return
     */
    /*public boolean isHappy(int n) {
        int sum = 0,count = 0;
        while (sum != 1 && count < 500) {
            while (n != 0){
                sum += (n % 10) * (n % 10);
                n /= 10;
            }
            n = sum;
            sum = 0;
            count++;
        }
        return n == 1;
    }*/

    /**
     * 参考英文网站热评第一。这题可以用快慢指针的思想去做，有点类似于检测是否为环形链表那道题
     * 如果给定的数字最后会一直循环重复，那么快的指针（值）一定会追上慢的指针（值），也就是
     * 两者一定会相等。如果没有循环重复，那么最后快慢指针也会相等，且都等于1。
     * @param n
     * @return
     */
    public boolean isHappy(int n) {
        int fast = n,slow = n;
        do {
            slow = getSum(slow);
            fast = getSum(fast);
            fast = getSum(fast);
        }while (fast != slow);
        return fast == 1;
    }

    private int getSum(int n){
        int sum = 0;
        while (n != 0){
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
}

